package number;

public class ProbOfDices {
  
  /*
   * 我们可以考虑用两个数组来存储骰子点数每一总数出现的次数。
   * 在一次循环中，第一个数组中的第n个数字表示骰子和为n出现的次数。
   * 那么在下一循环中，我们加上一个新的骰子。
   * 那么此时和为n的骰子出现的次数，应该等于上一次循环中骰子点数和为n-1、n-2、n-3、n-4、n-5与n-6的总和。
   * 所以我们把另一个数组的第n个数字设为前一个数组对应的第n-1、n-2、n-3、n-4、n-5与n-6之和
   */

  public static int maxV = 6;
  public static void probOfDices(int num){
    
    double p[][] = new double[2][maxV*num+1];
    for(int i = 0; i <maxV*num+1;i++ ){
      p[0][i]=0;
      p[1][i]=0;
      
    }
    
    int flag = 0;
    for(int i = 1; i <= maxV; i++)
      p[flag][i]=1;
    
    
    for(int k = 2; k <= num; ++k){
      for(int i = k;i <= maxV * k; ++i){
        p[1-flag][i]=0;
        for(int j = 1; j<= i && j <= maxV; ++j){
          p[1-flag][i] += p[flag][i-j];
        }
      }
      flag = 1-flag;
    }
    double total = Math.pow((double)maxV, num);
    for(int i = num; i<=maxV*num;i++){
      double ratio = p[flag][i]/total;
      System.out.println(i + " : " + ratio);
    }
  }
  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    probOfDices(3);
  }

}
